"""
强力指数将价格和成交量结合的方式，发现每次价格上涨/下跌过程中多头和空头的力量；可以应用到所有有成交量数据的价格图表中；汇集了价格的方向、变化程度及变化过程中成交量的变化，属于成交量指标之一；
强力指数指标早期为柱状图，通过移动平均线对其进行平滑，信号更加清晰；
短期EMA的强力指数指标可以定位入场和出场点，长期EMA的强力指标可以确认趋势的动能和重要的反转（背离时）；
指标的构造方式
强力指数数据=（当日收盘价-昨日收盘价）*当日成交量
指标核心的三要素为：方向、距离、成交量
1.如果收盘价高于昨日收盘价，力量为正，如果当日收盘价低于昨日收盘价，力量为负；
2.价格变化幅度越大，力量越大；
3.成交量越大，力量越大；
"""
class force_state:
    def __init__(self,timeperiod=1):
        self.timekey=None
        self.data=[]
        self.timeperiod=timeperiod+1
    def oncalc(self,macd,ema,timekey=None):
        rst=None
        if macd is not None and ema is not None:
            if timekey:
                if timekey == self.timekey:
                    self.data[-1]=(macd,ema)
                else:
                    self.data.append((macd,ema))
            else:
                self.data.append((macd,ema))
            if len(self.data)>self.timeperiod:
                self.data.pop(0)
            if len(self.data)>=self.timeperiod:
                pred=self.data[-self.timeperiod]
                if macd>pred[0] and ema>pred[1]:
                    rst="nosell"
                elif macd<pred[0] and ema<pred[1]:
                    rst = "nobuy"
        return rst


if __name__ == '__main__':
    from jili.core import load, save
    from research.calcor.calcors_graph import graph_calcor
    k1m = load(r"D:\data\future_k1m_tq\TA005\TA005_20200102.pkl")
    power_state1=power_state()
    cc = [
        {'calc_cmd': 'ta', 'cmd': 'MACD', 'out': ['macd', 'macdsignal', 'macdhist'],
         'input': {'price': 'close'}, 'arg': {'fastperiod': 12, 'slowperiod': 26, 'signalperiod': 9},
         'batch': 36},
        {'calc_cmd': 'ta', 'cmd': 'EMA', 'out': ['EMA5'], 'input': {'price': 'close'},
         'arg': {'timeperiod': 5}, 'batch': 5},
          {'calc_cmd': 'function', 'function': power_state1.oncalc, 'out': ['power_state1'], 'input': ["macdhist","EMA5","timekey"]}]
    c = graph_calcor(cc)
    k1ms = k1m[:90]
    for t in k1ms:
        t = c.onbar(t)
    print(t)
    t1 = k1m[90]
    t1["timekey"] = t["timekey"]
    t1 = c.onbar(t1)
    print(t1)
    print("end")
    print("end")